package tpN2.ejercicioN11;

import java.util.Scanner;

public class Dispositivo{
										
	//	parametros (String nomDispositivo, int idDispositivo, int velTransMin, int velTransMax)
	private static EntradaSalidaSUB IO = new EntradaSalidaSUB("PENDRIVE KINGSTON",9123874, 1, 5);
	private static MemoriaSUB memoria = new MemoriaSUB(1,8);
	private static Buffer buffer = new Buffer(5);
	private static String datos1 = "\n              Nombre: " + IO.getNomDispositivo();
	private static String datos2 = "\n           Número Id: " + IO.getIdDispositivo();
	private static String datos3 = "\n  Espacio en memoria: " + memoria.getTamanio() + " bits";
	private static String datos4 = "\n Palabras en memoria: " + memoria.getPalabras();
	private static String datos5 = "\n  Palabras en Buffer: " + buffer.getCapacidadBuffer();
	private static String datos6 = "\n    bits por palabra: " + memoria.getBits();
	private static String datos7 = "\n   vel. tranf. datos: rango(" + IO.getVelTransMin() + ", " + IO.getVelTransMax() + ")";
	private static String m1 = "\nIngrese la velocidad de transferencia de datos ";
	private static String m2 = "\nDebe ser un número entero entre " + IO.getVelTransMin() + " y " + IO.getVelTransMax();
	private static String m3 = "\nVelocidad de transferencia: ";
	private static String ERROR = "\n ERROR ----- Ingrese un número entero entre " + IO.getVelTransMin() + " y " + IO.getVelTransMax();
	private static String separador = "\n==============================================================";
	private static boolean primeraVez = true;
	private static Scanner s = new Scanner(System.in);
	
	public static void imprimir(String cadena, int T){
		System.out.println(cadena);
		tiempo(T);
	}
	public void iniciarConexion(){
		Scanner s = new Scanner(System.in);
		imprimir("\nPresione ENTER para conectar el dispositivo", 0);
		s.nextLine();
		int T = 2;
		imprimir("Conectando el dispositivo . . .", T);
		imprimir("\nIniciando la conexión . . .", T);
		imprimir("\nConexión iniciada.", T);
		IO.conectarse();  tiempo(T);
		getDescripcion(); tiempo(T*3);		
	}
	public void finalizarConexion(){
		Scanner s = new Scanner(System.in);
		imprimir("\nPresione ENTER para desconectar el dispositivo", 0);
		s.nextLine();
		imprimir("Finalizando la conexión . . .", 2);
		imprimir("\nConexión finalizada.", 2);
		IO.desconectarse();
	}	
	public static void tiempo(int num){
		try{
			Thread.currentThread();
			Thread.sleep(num * 1000);
		}catch (Exception ie){}
	}
	public static void getDescripcion(){
		imprimir(separador, 1);
		imprimir("\tDescripcion del dispositivo:", 1);
		imprimir(datos1 + datos2 + datos3 + datos4 + datos5 + datos6 + datos7, 1);
		imprimir(separador + "\n", 2);
	}
	
	
	/* el método ejecuta un bucle pidiendole al usuario un numero entero entre un rango estipulado
	 * el bucle solamente terminará cuando el usuario ingrese un numero válido
	 * antes de salir del metodo se setea la velocidad de trasmición actual 
	 */
	public void pedirVelocidadTransmision(){
		int vel = 0;
		boolean correcto = true;
		while (correcto){
			if (primeraVez)
				imprimir(m1 + m2, 1); // este mensaje se mostrará solo la primera vez
			System.out.print(m3);
			String numCadena = s.nextLine();
			try{
				vel = Integer.parseInt(numCadena);
			}catch (Exception e){}
			// si el num ingresado esta fuera del rango 
			if(vel < IO.getVelTransMin() || vel > IO.getVelTransMax()){
				imprimir(ERROR + separador, 1);
				primeraVez = false;
			}
			else
				correcto = false;
		}
		imprimir("\nGuardando la configuración . . .", 2);
		IO.setVelTransActual(vel); // seteamos la velocidad
	}

	public void gestionarEnvioDeDatosaMemoria(){
		if (!buffer.estaVacio()){
			imprimir("\nSe enviarán los datos a la MEMORIA.", 3);
			int indice = buffer.getIndiceAlmacenamiento();
			Integer[] datos = buffer.datosBuffer();
			for (int j = 0; j < indice; j++) {
				imprimir(separador, 0);
				imprimir("\nEnviando datos . . .", 0);
				tiempo(IO.getVelTransActual());
				memoria.guardarDatos(datos[j]);
				tiempo(1);
				memoria.verEstadoMemoria();
				tiempo(2);
			}
		}
	}
	public void guardarPalabrasEnBuffer(int palabras){
		imprimir("\nSe almacenarán " + palabras + " palabras de " + memoria.getBits() + " bits en el BUFFER.", 3);
		for(int i = 0; i < palabras; i++){
			imprimir(separador, 0);
			buffer.almacenarDato(10011010);
			tiempo(1);
		}
		imprimir(separador + separador, 0);		
	}
	
	public static void main(String[] args){
		Dispositivo dispositivo = new Dispositivo(); 
		dispositivo.iniciarConexion();
		dispositivo.pedirVelocidadTransmision();
		imprimir(separador, 1);
		memoria.verEstadoMemoria();
		tiempo(3);
		dispositivo.guardarPalabrasEnBuffer(7);
		dispositivo.gestionarEnvioDeDatosaMemoria();
		imprimir(separador + separador + separador, 4);
		imprimir("\nSe vacia el BUFFER y la MEMORIA . . .", 1);
		imprimir(separador, 0);
		buffer.vaciarBuffer();
		tiempo(2);
		memoria.borrarTodaLaMemoria();
		tiempo(2);
		imprimir(separador, 0);
		memoria.verEstadoMemoria();
		tiempo(2);
		imprimir(separador + separador, 1);
		dispositivo.finalizarConexion();
	}	
	
}
